home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Source / Shaders / RCShaders / RCWindowHighlight.sl < prev    next >
Encoding:
Text File  |  1995-03-22  |  2.9 KB  |  87 lines

  1. /* Listing 16.20  Surface shader providing a paned-window highlight*/
  2. /*
  3.  *  windowhighlight(): Give a surface a window-shaped specular highlight.
  4.  */
  5. surface 
  6. RCWindowHighlight(    
  7.     point    center    = point "world" (0, 0, -4), /* center of the window */
  8.         in    = point "world" (0, 0, 1),  /* normal to the wall */
  9.         up    = point "world" (0, 1, 0);  /* 'up' on the wall */
  10.     color    specularcolor = 1; 
  11.     float    Ka    = .3,
  12.         Kd    = .5,
  13.         xorder       = 2,    /* number of panes horizontally */
  14.         yorder       = 3,    /* number of panes vertically   */
  15.         panewidth  = 6,    /* horizontal size of a pane    */
  16.         paneheight = 6,    /* vertical size of a pane      */
  17.         framewidth = 1,    /* sash width between panes     */
  18.         fuzz       = .2;) /* transition region between pane and sash */
  19. {
  20.     uniform
  21.       point    in2,    /* normalized in */
  22.         right,     /* unit vector perpendicular to     in2 and up2 */
  23.         up2,    /* normalized up perpendicular to in         */
  24.         corner;    /* location of lower left corner of window   */
  25.       point     path,    /* incident vector I reflected about normal N */
  26.         PtoC,     /* vector from surface point to window corner */
  27.         PtoF;    /* vector from surface point to wall along path */
  28.       float     offset, modulus, yfract, xfract;
  29.       point     Nf = faceforward( normalize(N), I );
  30.  
  31.     /* Set up uniform variables as described above */
  32.     in2     = normalize(in);                
  33.     right     = up ^ in2;                
  34.     up2     = normalize(in2^right);
  35.     right    = up2 ^ in2;
  36.     corner = center - right*xorder*panewidth/2 - 
  37.                 up2*yorder*paneheight/2;
  38.  
  39.     path = reflect(I, normalize(Nf));    /* trace source of highlight */
  40.     PtoC = corner - Ps;
  41.  
  42.     if (path.PtoC <= 0) {    /* outside the room */
  43.     xfract = yfract = 0;
  44.     } else {
  45.  
  46.     /*
  47.      * Make PtoF be a vector from the surface point to the wall 
  48.      *    by adjusting the length of the reflected vector path.
  49.      */
  50.     PtoF = path * (PtoC.in2)/(path.in2);                        
  51.     /* 
  52.      * Calculate the vector from the corner to the intersection point, and
  53.      *    project it onto up2. This length is the vertical offset of the
  54.      *     intersection point within the window.
  55.      */
  56.     offset = (PtoF - PtoC).up2;
  57.     modulus = mod(offset, paneheight);
  58.     if( offset > 0 && offset/paneheight < yorder ) { /* inside the window */
  59.         if( modulus > (paneheight/2))                        /* symmetry about pane center  */
  60.         modulus = paneheight - modulus;
  61.         yfract = smoothstep(    /* fuzz at the edge of a pane    */
  62.         (framewidth/2) - (fuzz/2),
  63.         (framewidth/2) + (fuzz/2),
  64.         modulus);
  65.     } else {
  66.         yfract = 0;
  67.     }
  68.  
  69.     /* Repeat the process for horizontal offset */
  70.     offset = (PtoF - PtoC).right;
  71.     modulus = mod(offset, panewidth);
  72.     if( offset > 0 && offset/panewidth < xorder ) {
  73.         if( modulus > (panewidth/2))
  74.         modulus = panewidth - modulus;
  75.         xfract = smoothstep( 
  76.         (framewidth/2) - (fuzz/2),
  77.         (framewidth/2) + (fuzz/2),
  78.         modulus);
  79.     } else {
  80.         xfract = 0;
  81.     }
  82.     }
  83.     /* specular calculation using the highlight */
  84.     Ci = Cs * (Kd*diffuse(Nf) + Ka*ambient())
  85.       + yfract*xfract*specularcolor ;
  86. }
  87.